package br.edu.fateczl.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import br.edu.fateczl.model.Obra;
import br.edu.fateczl.model.Publicacao;

public class ObraDAO {
	Connection c;

	public ObraDAO() {
		GenericDAO gDao = new GenericDAO();
		c = gDao.getConnection();
	}

	public boolean insereObra(Obra obra) {
		boolean inserido = false;
		String sql = "INSERT INTO obra (titulo,autor,classificacao,emprestavel,num_exemplares) VALUES (?,?,?,?,?)";

		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setString(1, obra.getTitulo());
			ps.setString(2, obra.getAutor());
			ps.setString(3, obra.getClassificacao());
			ps.setBoolean(4, obra.getEmprestavel());
			ps.setInt(5, obra.getNumExemplares());
			ps.execute();
			ps.close();
			inserido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return inserido;
	}

	public boolean atualizaObra(Obra obra) {
		boolean atualizado = false;
		String sql = "UPDATE obra Set titulo=?,autor=?,classificacao=?,emprestavel=?,num_exemplares=? WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setString(1, obra.getTitulo());
			ps.setString(2, obra.getAutor());
			ps.setString(3, obra.getClassificacao());
			ps.setBoolean(4, obra.getEmprestavel());
			ps.setInt(5, obra.getNumExemplares());
			ps.setInt(6, obra.getCodigo());
			ps.execute();
			ps.close();
			atualizado = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return atualizado;

	}

	public boolean excluiObra(Obra obra) {
		boolean excluido = false;
		String sql = "DELETE obra WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, obra.getCodigo());
			ps.execute();
			ps.close();
			excluido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return excluido;
	}

	public Obra consultaObra(Obra obra) {
		Obra obraConsultada = new Publicacao();

		String sql = "SELECT codigo,titulo,autor,classificacao,emprestavel,num_exemplares FROM obra Where codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, obra.getCodigo());
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				obraConsultada.setCodigo(Integer.parseInt(rs
						.getString("codigo")));
				obraConsultada.setTitulo(rs.getString("titulo"));
				obraConsultada.setAutor(rs.getString("autor"));
				obraConsultada.setClassificacao(rs.getString("classificacao"));
				obraConsultada.setEmprestavel(rs.getBoolean("emprestavel"));
				obraConsultada.setNumExemplares(rs.getInt("num_exemplares"));
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return obraConsultada;
	}

	public List<Obra> consultaListaObra() {
		List<Obra> listaObra = new ArrayList<Obra>();
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT codigo,titulo,autor,classificacao,emprestavel,num_exemplares");
		sql.append(" FROM obra");
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Obra obraConsultada = new Publicacao();
				obraConsultada.setCodigo(rs.getInt("codigo"));
				obraConsultada.setTitulo(rs.getString("titulo"));
				obraConsultada.setAutor(rs.getString("autor"));
				obraConsultada.setClassificacao(rs.getString("classificacao"));
				obraConsultada.setEmprestavel(rs.getBoolean("emprestavel"));
				obraConsultada.setNumExemplares(rs.getInt("num_exemplares"));
				listaObra.add(obraConsultada);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return listaObra;
	}

	public List<Obra> consultaListaObraEmprestaveis() {
		List<Obra> listaObra = new ArrayList<Obra>();
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT codigo,titulo,autor,classificacao,emprestavel,num_exemplares");
		sql.append(" FROM obra");
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Obra obraConsultada = new Publicacao();
				obraConsultada.setCodigo(rs.getInt("codigo"));
				obraConsultada.setTitulo(rs.getString("titulo"));
				obraConsultada.setAutor(rs.getString("autor"));
				obraConsultada.setClassificacao(rs.getString("classificacao"));
				obraConsultada.setEmprestavel(rs.getBoolean("emprestavel"));
				obraConsultada.setNumExemplares(rs.getInt("num_exemplares"));
				if (obraConsultada.getEmprestavel() == true) {
					listaObra.add(obraConsultada);
				}
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return listaObra;
	}

	public int selecionarUltimaObra() throws SQLException {
		String sql = "select max(codigo) as codigo from obra";
		Connection con = GenericDAO.getConnection();
		PreparedStatement prepare = con.prepareStatement(sql);
		ResultSet result = prepare.executeQuery();
		int codigo = 0;

		while (result.next()) {
			codigo = result.getInt("codigo");
		}

		return codigo;
	}

}
